<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>作用域链和闭包</title>
    </head>
    <body>
    <p>javascript中只有函数具有作用域。。函数体外不能访问体内变量。</p>
    <p>从下面的代码可以看出，从add()到accounter()到全局是一个‘作用域链’。</p>
    <p>所以现在问题是怎么通过暴露的接口调用内部方法add()这个方法呢？方法有两种：
    <br>
		（1）将调用的方法作为返回值。 如：将自减方法作为返回值。  
		（2）设定外层作用于变量。如getN
    </p>
    <p>
    	这是n就处在一个闭包中。不能在accounter()外部访问，但可以通过这两个方法观察和操作。
		<hr>
		<strong>闭包的功能机制，在函数作用域内，但不由该函数控制销毁。</strong>在这段代码中。在accounter()执行结束后n并不会立即销毁。因为account()会调用这个变量。getN()也会调用这个变量。
    </p>
    <p>
    	如果我要两个相同功能的对象。总不能重新再写一遍吧！！
    	于是使用到了<strong>new和构造函数</strong>
    </p>
    <script>
    	//json风格模块化  json对象
    	var config={  
    		start:100,
    		step:2
    	}
    	var getN;
    	//作用域链和闭包
    	function accounter(config){
    		var n=config.start;
    		function add(){
    			n+=config.step;
    		}
    		getN=function(){
    			return n;
    		}
    		return function(){
    			n-=config.step;
    		}
    	}
    	console.log(accounter.n);  //undefined   相对accounter来说，n是在他的子级作用域，所以不能访问。
		//add() //102   add()可以访问。相对add来说，n是在父级作用域。所以可以访问。
		var account=accounter(config);
		account();//返回这个方法并调用这个方法
		console.log(getN());  //100-2--->98



    </script>

    </body>
</html>